package com.example.oop.ServerOperation.NetOperation;

//网络数据包协议
public class NetPacket {
    // 类型常量
    public static final byte BINARY = 0;
    public static final byte TEXT = 1;

    // 请求头
    private byte type; // 内容类型  0: 二进制, 1:字符串
    private byte flag; // reserved
    private short action; // 消息码 或 命令码
    private int length; // 内容长度

    // 内容
    private byte[] content;

    //    构造函数，设置响应、请求类型，请求体类型
    public NetPacket(byte type, byte flag, short action) {
        this.type = type;
        this.flag = flag;
        this.action = action;
    }

    //    设置字节内容 -> 设置content和size
    public void setContent(byte[] msg, int size) {
        this.content = msg;
        this.length = size;
    }

    //     设置文本内容 -> 主要是设置内容和内容的长度
    public void setContent(String msg, String charset) {
        if (msg == null) {  //没有传入信息，长度设置为0
            this.length = 0;
            return;
        }

        try {
            this.content = msg.getBytes(charset);  //保存内容
            this.length = this.content.length;  //获取内容的长度
        } catch (Exception e) {
            // 一般不会出错，除非在指定charset的时候写错了
            String message = e.getMessage() + ":" + e.getClass().getName();
            this.content = message.getBytes();
            this.length = this.content.length;
        }
    }

    //     获取 content 字段  (文本方式)
    public String toString(String charset) {
        if (this.length <= 0)
            return "";
        if (this.type == BINARY)
            return "此数据包为BINARY类型!";

        try {
            String str = new String(content, 0, length, charset);
            return str;
        } catch (Exception e) {
            return e.getMessage() + " : " + e.getClass().getName();
        }
    }

    @Override
    public String toString() {
        return toString("UTF-8");
    }

    public byte getType() {
        return type;
    }

    public byte getFlag() {
        return flag;
    }

    public short getAction() {
        return action;
    }

    public int getLength() {
        return length;
    }

    public byte[] getContent() {
        return content;
    }
}
